#!/bin/bash

# 后端管理系统独立部署脚本（项目内）
set -e

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() { printf "${BLUE}[INFO]${NC} %s\n" "$1"; }
log_success() { printf "${GREEN}[SUCCESS]${NC} %s\n" "$1"; }
log_warning() { printf "${YELLOW}[WARNING]${NC} %s\n" "$1"; }
log_error() { printf "${RED}[ERROR]${NC} %s\n" "$1"; }

# 获取脚本所在目录的绝对路径
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"

check_docker() {
    if ! command -v docker >/dev/null 2>&1; then
        log_error "Docker未安装"
        exit 1
    fi
    if ! command -v docker-compose >/dev/null 2>&1; then
        log_error "Docker Compose未安装"
        exit 1
    fi
}

build_on_host() {
    log_info "在宿主机构建后端管理系统..."
    
    # 确保在项目根目录执行
    cd "$PROJECT_ROOT" || {
        log_error "无法切换到项目根目录: $PROJECT_ROOT"
        exit 1
    }
    
    log_info "当前工作目录: $(pwd)"
    
    if [ ! -f .env ]; then
        log_warning ".env 文件不存在，复制 env.example 为 .env"
        cp env.example .env || true
    fi
    log_info "清理之前的构建文件..."
    rm -rf .next node_modules/.cache 2>/dev/null || true
    log_info "安装依赖..."
    if command -v pnpm >/dev/null 2>&1; then pnpm install; else npm install; fi
    log_info "生成Prisma客户端..."
    if [ -f "node_modules/.bin/prisma" ]; then 
        ./node_modules/.bin/prisma generate --schema=./prisma/schema.prisma
    else 
        npx prisma generate --schema=./prisma/schema.prisma
    fi
    log_info "构建应用（使用内存优化选项）..."
    
    # 设置 Node.js 内存限制和优化选项
    export NODE_OPTIONS="--max-old-space-size=2048 --max-semi-space-size=128"
    export NEXT_TELEMETRY_DISABLED=1
    
    if command -v pnpm >/dev/null 2>&1; then 
        pnpm build
    else 
        npm run build
    fi
    log_success "后端构建完成"
}

deploy() {
    log_info "部署后端管理系统 (端口: 5090)..."
    
    # 确保在项目根目录执行
    cd "$PROJECT_ROOT" || {
        log_error "无法切换到项目根目录: $PROJECT_ROOT"
        exit 1
    }
    
    log_info "当前工作目录: $(pwd)"
    log_info "检查 docker-compose.yml 文件..."
    if [ ! -f "docker-compose.yml" ]; then
        log_error "docker-compose.yml 文件不存在于 $(pwd)"
        exit 1
    fi
    
    export NODE_ENV=production
    export COMPOSE_PROJECT_NAME=person-development

    # 创建必要的目录
    log_info "创建必要的目录（logs/uploads/backups/nginx/ssl）..."
    mkdir -p logs uploads backups nginx/ssl

    # 备份数据库（如果存在）
    if [ -f "scripts/backup.sh" ]; then
        log_info "检测到备份脚本，执行数据库备份..."
        chmod +x scripts/backup.sh
        ./scripts/backup.sh || log_warning "备份执行失败或未配置，继续部署"
    fi

    # 停止现有服务
    log_info "停止现有服务..."
    docker-compose -f docker-compose.yml down --remove-orphans || true

    # 兜底处理：如果仍有同名容器存在（可能由其他 compose/project 创建），强制移除
    if docker ps -a --format '{{.Names}}' | grep -wq "kason-world"; then
        log_warning "检测到残留容器 kason-world，执行强制移除..."
        docker rm -f kason-world || true
    fi

    # 清理旧镜像（增加超时与降级处理，避免偶发卡住）
    log_info "清理无用 Docker 数据..."
    if command -v timeout >/dev/null 2>&1; then
        timeout 30s docker system prune -f || {
            log_warning "docker system prune 超时或失败，尝试精简清理..."
            docker image prune -f >/dev/null 2>&1 || true
            docker builder prune -f >/dev/null 2>&1 || true
        }
    else
        # 无 timeout 命令时，不阻塞部署
        docker system prune -f >/dev/null 2>&1 || log_warning "docker system prune 失败，已跳过"
    fi

    # 构建新镜像
    log_info "构建后端 Docker 镜像（docker-compose.yml）..."
    docker-compose -f docker-compose.yml build --no-cache

    # 启动服务
    log_info "启动后端服务（docker-compose.yml）..."
    docker-compose -f docker-compose.yml up -d --remove-orphans

    # 健康检查
    log_info "执行健康检查..."
    success=false
    for i in {1..10}; do
        if curl -f -s http://localhost:5090/api/health > /dev/null 2>&1; then success=true; break; else log_info "等待服务启动... ($i/10)"; sleep 10; fi
    done
    if [ "$success" = true ]; then
        log_success "服务启动成功！"
    else
        log_error "服务启动失败，请检查日志"
        docker-compose -f docker-compose.yml logs --tail=100 || true
        exit 1
    fi

    # 显示日志尾部
    log_info "显示服务日志..."
    docker-compose -f docker-compose.yml logs --tail=50 || true

    log_success "部署完成！"
    log_info "访问地址: http://localhost:5090"
    log_info "健康检查: http://localhost:5090/api/health"
}

check_docker
build_on_host
deploy
